<?php
/* 用户提交控制器 */

namespace App\Http\Controllers\User;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; //引入DB门面
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Storage;

class ConnonController extends Controller
{
    //登录
    public function login(Request $request)
    {
        //自动验证   $this为当前类
        $this->validate(
            $request,
            [
                //具体规则  字段=>验证规则1|验证规则2|...  验证规则在手册上
                'user' => 'required|min:4|max:10|alpha_num',
                'passwd' => 'required|min:6|max:32|alpha_num'
            ],
            [
                'user.alpha_num' => '账号只能是数字或字母',
                'user.min' => '账号长度必能小于5位',
                'passwd.alpha_num' => '密码只能是数字或字母',
            ]
        );

        //条件查询
        $data = DB::table('ly_user')->where('user_name', $request->user)->where('passwd', md5($request->passwd))->get();
        // dd(md5($request->passwd));

        // dd($data);
        //判断数据是否空
        if ($data == null || $data == '[]') {
            Session::put('isChatUserLogin', false); //登录状态
            return redirect('/login.html'); //返回登录页
        } else {
            Session::put('isChatUserLogin', true); //登录状态
            Session::put('isUserName', $request->user); //登录账号
            Session::put('isUserPasswd', $request->passwd); //登录密码
            return redirect('/'); //跳转首页
        }
    }

    //积分更新
    public function jifen($name, $t = 1)
    {
        if ($t == 1) { //邀请
            $val = DB::table('ly_integral')->value('invite');
        } else {
            $val = DB::table('ly_integral')->value('signin');
        }
        $data = DB::table('ly_user')->where('user_name', $name)->join('ly_info', 'info_id', 'ly_info.uid')->first();
        if ($data == null) {
            return false;
        }
        $z = $val + $data->integral;

        $result = DB::table('ly_info')->where("uid", $data->uid)->update([
            'integral' => $z
        ]);
        if ($result) {
            return true;
        } else {
            return false;
        }
    }

    //邀请记录
    public function yqinvite($olduser, $newuser)
    {
        $val = DB::table('ly_integral')->value('invite');
        DB::table('ly_invite')->insert([
            'user_id' => $olduser,
            'new_user' => $newuser,
            'integral' => $val,
        ]);
    }

    //注册
    public function register(Request $request)
    {
        $this->validate(
            $request,
            [
                //具体规则  字段=>验证规则1|验证规则2|...  验证规则在手册上
                'user' => 'required|min:6|max:10|alpha_num',
                'passwd' => 'required|min:6|max:32|alpha_num',
                'passwd2' => 'required|same:passwd',
                'name' => 'required|min:2|max:32',
                'email' => 'required|email',
            ],
            [
                'user.alpha_num' => '账号只能是数字或字母',
                'user.min' => '账号长度必须大于6位且小于十位',
                'user.max' => '账号长度必须大于6位且小于十位',
                'passwd.alpha_num' => '密码只能是数字或字母',
                'name.min' => '昵称必须大于两个字符',
            ]
        );
        $code = $request->code;
        if (DB::table('ly_user')->where('user_name', $request->user)->get() == '[]') {
            DB::beginTransaction();
            $db = DB::table('ly_info')->insertGetId([
                'nickname' => $request->name,
                'email' => $request->email,
            ]);
            if ($db) {
                $uid = $db;
                $res = DB::table('ly_user')->insert([
                    'user_name' => $request->user, //用户名
                    'passwd' => md5($request->passwd), //密码
                    'info_id' => $uid, //关联信息
                    'invite' => $request->user, //邀请码
                    'invite_form' => $code, //来自xx邀请码

                ]);
                if ($code != null) {
                    $this->jifen($code);
                    $this->yqinvite($code, $request->user);
                }
                if ($res) {
                    return redirect('/login.html');
                } else {
                    DB::rollBack();
                    DB::commit();
                }
            } else {
                DB::rollBack();
                DB::commit();
            }
        } else {
            $this->validate(
                $request,
                [
                    //具体规则  字段=>验证规则1|验证规则2|...  验证规则在手册上
                    'user' => 'min:255',
                ],
                [
                    'user.min' => '该账号已经注册',
                ]
            );
        }
    }

    //聊天图片
    public function upmsgimg(Request $request)
    {
        //判断是否是POST上传，应该不会有人用get吧，恩，不会的
        if ($request->isMethod('POST')) {
            //文件保存路径
            $Route_icon = '/cache/msg/' . date('Ymd') . '/';

            //在源生的php代码中是使用$_FILE来查看上传文件的属性
            //但是在laravel里面有更好的封装好的方法，就是下面这个,显示的属性更多
            $fileCharater = $request->file('file');
            // dd($fileCharater);
            $name = md5($request->name); //用户名
            $fileSize = $fileCharater->getClientSize();
            if ($fileSize > (1024 * 128)) {
                return response($this->_tips(204, '图片不能大于128k'));
            }
            //括号里面的是必须加的 如果括号里面的不加上的话，下面的方法也无法调用的
            if ($fileCharater->isValid()) {
                //获取文件的扩展名 
                $ext = $fileCharater->getClientOriginalExtension();
                //允许上传文件
                $exts = ['jpg', 'png'];
                //验证上传文件
                if (!in_array($ext, $exts)) {
                    return response($this->_tips(204, '不支持的扩展名'));
                }

                //获取文件的绝对路径
                $path = $fileCharater->getRealPath();

                //定义文件名
                // $filename = date('Y-m-d-h-i-s') . '.' . $ext;
                $filename = $name . '.' . $ext;

                //存储文件。disk里面的public。总的来说，就是调用disk模块里的public配置
                Storage::disk('cache')->put($filename, file_get_contents($path));
                //输出文件路径
                $_path = $Route_icon . $filename;
                return response($this->_tips(200, '上传成功', ['url' => $_path]));
            }
        } else {
            return response($this->_tips(204, '操作失败'));
        }
    }

    //B64图片接口
    public function b64img(Request $request)
    {
        $content = $request->content;
        if ($content != null) {
            //匹配出图片的格式
            if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $content, $result)) {
                //图片后缀
                $type = $result[2];
                //允许上传文件
                $exts = ['jpg', 'png', 'jpeg'];

                $img_data = str_replace($result[1], '', $content);
                $img_len = strlen($img_data);
                $img_size = ($img_len - ($img_len / 8) * 2) / 1024;

                if ($img_size > 128) {
                    return response($this->_tips(204, '图片不能大于128k', $img_size));
                }
                //验证上传文件
                if (!in_array($type, $exts)) {
                    return response($this->_tips(204, '不支持的扩展名文件'));
                }
                //文件保存路径
                $Route_icon = '/cache/msg/' . date('Ymd') . '/';
                //文件名
                $name = time();
                //定义文件名
                $filename = $name . '.' . $type;
                //编码转换
                $content = base64_decode($img_data);
                //存储文件。disk里面的public。总的来说，就是调用disk模块里的public配置
                Storage::disk('cache')->put($filename, $content);
                //输出文件路径
                $_path = $Route_icon . $filename;
                return response($this->_tips(200, '上传成功', ['url' => $_path]));
            } else {
                return response($this->_tips(204, '无效格式'));
            }
        }
    }

    //用户信息修改
    public function infoedit(Request $request)
    {
        $zx = null;
        if ($request->name != null) {
            $data = DB::table('ly_user')->where('user_name', $request->name)->join('ly_info', 'info_id', 'ly_info.uid')->first();
            if ($data == null || $data == '[]') {
                return response($this->_tips(204, '操作失败'));
            } else {

                if ($request->nc != null) {
                    $zx = [
                        'nickname' => $request->nc,
                        'uptime' => date('Y-m-d H:i:s', time())
                    ];
                }

                if ($request->yx != null) {
                    $zx = [
                        'email' => $request->yx,
                        'uptime' => date('Y-m-d H:i:s', time())
                    ];
                }

                if ($request->qm != null) {
                    $zx = [
                        'art' => $request->qm,
                        'uptime' => date('Y-m-d H:i:s', time())
                    ];
                }

                if ($request->tx != null) {
                    $zx = [
                        'icon' => $request->tx,
                        'uptime' => date('Y-m-d H:i:s', time())
                    ];
                }

                if ($zx != null) {
                    $result = DB::table('ly_info')->where('uid', $data->info_id)->update($zx);
                    if ($result) {
                        return response($this->_tips(200, '保存成功'));
                    } else {
                        return response($this->_tips(204, '保存失败'));
                    }
                }
            }
        }
    }

    //用户头像
    public function upimg(Request $request)
    {
        //判断是否是POST上传，应该不会有人用get吧，恩，不会的
        if ($request->isMethod('POST')) {
            //文件保存路径
            $Route_icon = '/upimg/' . date('Ymd') . '/';

            //在源生的php代码中是使用$_FILE来查看上传文件的属性
            //但是在laravel里面有更好的封装好的方法，就是下面这个,显示的属性更多
            $fileCharater = $request->file('file');
            $name = md5($request->name); //用户名

            $fileSize = $fileCharater->getClientSize();
            if ($fileSize > (1024 * 128)) {
                return response($this->_tips(204, '图片不能大于128k'));
            } else {
                //括号里面的是必须加的 如果括号里面的不加上的话，下面的方法也无法调用的
                if ($fileCharater->isValid()) {
                    //获取文件的扩展名 
                    $ext = $fileCharater->getClientOriginalExtension();
                    //允许上传文件
                    $exts = ['jpg', 'png'];

                    //验证上传文件
                    if (!in_array($ext, $exts)) {
                        return response($this->_tips(204, '不支持的扩展名'));
                    }

                    //获取文件的绝对路径
                    $path = $fileCharater->getRealPath();

                    //定义文件名
                    // $filename = date('Y-m-d-h-i-s') . '.' . $ext;
                    $filename = $name . '.' . $ext;

                    //存储文件。disk里面的public。总的来说，就是调用disk模块里的public配置
                    Storage::disk('upimg')->put($filename, file_get_contents($path));
                    //输出文件路径
                    $_path = $Route_icon . $filename;
                    return response($this->_tips(200, '上传成功', ['url' => $_path]));
                }
            }
        } else {
            return response($this->_tips(204, '操作失败'));
        }
    }

    //创建房间
    public function addroom(Request $request)
    {
        $room = $request->room;
        $passwd = $request->passwd;
        $username = Session::get('isUserName');
        $data = DB::table('ly_user')->where('user_name', $username)->join('ly_info', 'info_id', 'ly_info.uid')->first();

        if ($data->lv >= DB::table('ly_room')->where('room_user', $username)->count() + 1 && $data->lv != 0) {

            $result = DB::table('ly_room')->insertGetId([
                'room_pwd' => $passwd, //密码
                'room_title' => $room, //房间标题
                'room_icon' => '/assets/home/img/a1.jpg', //房间图片
                'room_user' => $username //创建者
            ]);

            if ($result) {
                $_msg = '房间创建成功';
                if ($request->file != null) {
                    //判断是否是POST上传，应该不会有人用get吧，恩，不会的
                    if ($request->isMethod('POST')) {
                        //文件保存路径
                        $Route_icon = '/upimg/' . date('Ymd') . '/';

                        //在源生的php代码中是使用$_FILE来查看上传文件的属性
                        //但是在laravel里面有更好的封装好的方法，就是下面这个,显示的属性更多
                        $fileCharater = $request->file('file');
                        $name = md5($request->username . $result); //用户名+返回id

                        //括号里面的是必须加的 如果括号里面的不加上的话，下面的方法也无法调用的
                        if ($fileCharater->isValid()) {
                            //获取文件的扩展名 
                            $ext = $fileCharater->getClientOriginalExtension();
                            //允许上传文件
                            $exts = ['jpg', 'png'];
                            $_code = true;
                            //验证上传文件
                            if (!in_array($ext, $exts)) {
                                $_msg = '头像格式错误,使用默认头像';
                                $_code = null;
                            }

                            //获取文件的绝对路径
                            $path = $fileCharater->getRealPath();

                            //定义文件名
                            // $filename = date('Y-m-d-h-i-s') . '.' . $ext;
                            $filename = $name . '.' . $ext;

                            //存储文件。disk里面的public。总的来说，就是调用disk模块里的public配置
                            Storage::disk('upimg')->put($filename, file_get_contents($path));
                            //输出文件路径
                            $_path = $Route_icon . $filename;
                            if ($_code != null) {
                                $t = DB::table('ly_room')->where('room_id', $result)->update([
                                    'room_icon' => $_path, //房间图片
                                ]);
                                if ($t) {
                                    $_msg = '房间创建成功';
                                } else {
                                    $_msg = '头像保存失败,使用默认头像';
                                }
                            }
                        }
                    }
                }
                return response($this->_tips(200, $_msg));
            } else {
                return response($this->_tips(204, '创建失败'));
            }
        } else {
            return response($this->_tips(204, '创建失败,已创建房间达到账号上限'));
        }
    }

    //处罚
    public function punish(Request $request)
    {
        $room = $request->room;
        $name = $request->name;
        $code = $request->code;
        $admin =  Session::get('isUserName');

        if ($code == 1) {
            $md = "禁言";
        }

        if ($code == 2) {
            $md = "拉黑";
        }

        //判断参数
        if ($room != null && $name != null && $code != null && !empty($admin)) {
            //判断操作者权限
            $data = DB::table('ly_room')->where('room_user', $admin)->where('room_id', $room)->first();
            if ($data == '[]' || $data == null) {
                return response($this->_tips(204, '权限不足'));
            } else {
                if ($data->room_user == $admin && $name == $admin) {
                    return response($this->_tips(204, '不能对自己进行操作'));
                } else {
                    //判断用户状态
                    $user = DB::table('ly_punish')->where('user_id', $name)->where('result', $code)->get();
                    if ($user == '[]' || $user == null) {
                        $result = DB::table('ly_punish')->insertGetId([
                            'user_id' => $name, //用户名
                            'room_id' => $room, //房间ID
                            'result' => $code, //操作
                            'user_admin' =>  $admin //创建者
                        ]);
                        if ($result) {
                            return response($this->_tips(200, $md . '成功', 'ok'));
                        } else {
                            return response($this->_tips(204, $md . "失败"));
                        }
                    } else {
                        $result = DB::table('ly_punish')->where('user_id', $name)->where('result', $code)->delete();
                        if ($result) {
                            return response($this->_tips(200, $md . '解除成功', 'no'));
                        } else {
                            return response($this->_tips(204, $md . '解除失败'));
                        }
                    }
                }
            }
        }
    }


    //签到记录
    public function userqd(Request $request)
    {
        $name = $request->name;
        if ($name != null) {
            $data = DB::table('ly_signin')->where('user_id', $name)->get();
            $qd = DB::table('ly_integral')->value('signin');
            if ($data == '[]' || $data == null) {
                $res = DB::table('ly_signin')->insert([
                    'user_id' => $name, //用户名
                    'get' => $qd, //积分
                ]);
                if ($res) {
                    $this->jifen($name, 2);
                    return response($this->_tips(200, '签到成功', $qd));
                } else {
                    return response($this->_tips(204, '签到失败', 0));
                }
            } else {
                $date = date("Y-m-d");
                foreach ($data as $key => $value) {
                    if ($date == date("Y-m-d", strtotime($value->time))) {
                        return response($this->_tips(200, '重复签到', 0));
                    } else {
                        $result = true;
                    }
                }
                if ($result === true) {
                    $res = DB::table('ly_signin')->insert([
                        'user_id' => $name, //用户名
                        'get' => $qd, //积分

                    ]);
                    if ($res) {
                        $this->jifen($name, 2);
                        return response($this->_tips(200, '签到成功', $qd));
                    } else {
                        return response($this->_tips(204, '签到失败', 0));
                    }
                }
            }
        } else {
            return response($this->_tips(204, '格式错误'));
        }
    }

    //升级
    public function userlv(Request $request)
    {
        $name = $request->name;
        if ($name != null) {

            $data = DB::table('ly_user')->where('user_name', $name)->join('ly_info', 'info_id', 'ly_info.uid')->first();
            if ($data == null || $data == '[]') {
                return response($this->_tips(204, '格式错误'));
            } else {
                $lvs = ($data->lv + 1);
                $lv = DB::table('ly_lv')->where('sign', $lvs)->first();
                if ($lv == null || $lv == '[]') {
                    return response($this->_tips(204, '已是最高级'));
                } else {
                    if ($data->integral >= $lv->exp) {
                        $integral = $data->integral - $lv->exp;
                        $res = DB::table('ly_info')->where('uid', $data->info_id)->update([
                            'lv' => $lv->sign,
                            "integral" => $integral
                        ]);
                        if ($res) {
                            return response($this->_tips(200, '升级成功'));
                        } else {
                            return response($this->_tips(204, '升级失败'));
                        }
                    } else {
                        return response($this->_tips(204, '升级积分不足'));
                    }
                }
            }
        }
    }

    //修改房间
    public function editroom(Request $request)
    {
        $id = $request->room_id;
        $room = $request->room;
        $passwd = $request->passwd;
        $username = Session::get('isUserName');
        if ($id != null && $room != null) {
            $result = DB::table('ly_room')->where('room_id', $id)->where('room_user', $username)->first();
            if ($result == null) {
                return response($this->_tips(204, '房间不存在'));
            } else {
                if ($passwd == null) {
                    $val['room_pwd'] = '';
                } else {
                    $val['room_pwd'] = $passwd;
                }
                $val['room_title'] = $room;
                $res = DB::table('ly_room')->where('room_id', $id)->update($val);
                if ($res >= 0) {
                    $_msg = '房间修改成功';
                    if ($request->file != null) {
                        //判断是否是POST上传，应该不会有人用get吧，恩，不会的
                        if ($request->isMethod('POST')) {
                            //文件保存路径
                            $Route_icon = '/upimg/' . date('Ymd') . '/';

                            //在源生的php代码中是使用$_FILE来查看上传文件的属性
                            //但是在laravel里面有更好的封装好的方法，就是下面这个,显示的属性更多
                            $fileCharater = $request->file('file');
                            $name = md5($username . $id); //用户名+返回id

                            $fileSize = $fileCharater->getClientSize();
                            if ($fileSize > (1024 * 128)) {
                                return response($this->_tips(204, '图片不能大于128k'));
                            }

                            //括号里面的是必须加的 如果括号里面的不加上的话，下面的方法也无法调用的
                            if ($fileCharater->isValid()) {
                                //获取文件的扩展名 
                                $ext = $fileCharater->getClientOriginalExtension();
                                //允许上传文件
                                $exts = ['jpg', 'png'];
                                $_code = true;
                                //验证上传文件
                                if (!in_array($ext, $exts)) {
                                    $_msg = '头像格式错误,使用默认头像';
                                    $_code = null;
                                }

                                //获取文件的绝对路径
                                $path = $fileCharater->getRealPath();

                                //定义文件名
                                // $filename = date('Y-m-d-h-i-s') . '.' . $ext;
                                $filename = $name . '.' . $ext;

                                //存储文件。disk里面的public。总的来说，就是调用disk模块里的public配置
                                Storage::disk('upimg')->put($filename, file_get_contents($path));
                                //输出文件路径
                                $_path = $Route_icon . $filename;
                                if ($_code != null) {
                                    $t = DB::table('ly_room')->where('room_id', $id)->update([
                                        'room_icon' => $_path, //房间图片
                                    ]);
                                    if ($t) {
                                        $_msg = '房间修改成功';
                                    } else {
                                        $_msg = '头像保存失败,使用默认头像';
                                    }
                                }
                            }
                        }
                    }
                    return response($this->_tips(200, $_msg));
                } else {
                    return response($this->_tips(204, '房间修改失败'));
                }
            }
        } else {
            return response($this->_tips(204, '格式错误'));
        }
    }

    //房间解散
    public function delroom(Request $request)
    {
        $id = $request->id;
        if ($id != null) {
            $result = DB::table('ly_room')->where('room_id', $id)->where('room_user', Session::get('isUserName'))->first();
            if ($result == null) {
                return response($this->_tips(200, '房间不存在'));
            } else {
                $res = DB::table('ly_room')->where('room_id', $id)->delete();
                if ($res) {
                    return response($this->_tips(200, '解散成功'));
                } else {
                    return response($this->_tips(200, '解散失败'));
                }
            }
        } else {
            return response($this->_tips(204, '格式错误'));
        }
    }
}
